package singleton.demo1;

public class Test04 {
    private Test04(){}

    private static volatile Test04 INS;

    // synchronized 效率下降
    /*public static synchronized Test04 getInstance(){
        if(null == INS){
            try{
                Thread.sleep(1);
            }catch (Exception e){
                e.printStackTrace();
            }

            INS = new Test04();
        }

        return INS;
    }*/
    public static Test04 getInstance(){
        if(null == INS){
            synchronized (Test04.class) { // 减少锁的范围 但是线程瞬时间都会通过 if(null == INS){ 所以即便锁住了 也会出现问题 所以内部还需要在if(null == INS){判断下
                try {
                    Thread.sleep(1);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if(null == INS) { // 线程瞬时会通过顶层的 if(null == INS){ 所以这里在判断
                    INS = new Test04();
                }
            }
        }
        return INS;
    }
}
